检测数组

js中如何判断数组对象

这个好像提起来好简单啊。可能在java或者c当中这种东西就是一句话的问题,为毛这里要特别的还要写个blog来研究。。

其实小弟本来也是抱着这样的想法,直到有一天看到了大漠老师的一篇深入浅出的blog:http://www.w3cplus.com/javascript/array-part-2.html

才发现。。。自己too naive, too simple

javascript是一门弱语言,这个不仅仅是体现在变量上面的没有类型的强制性。还体现在在js世界中,其实像Function啊Array啊它们本质上都是对象。这就导致了我们在对某个变量进行类型检测的时候,如果只是简单的采用typeof去测它的话得到的大部分给你的答案都是Object。。。俗称:万物皆对象。

1
2
3
4
5
6
7
8
9
10
console.log(typeof function () {return;}); // function
console.log(typeof "a"); // string
console.log(typeof 123); // number
console.log(typeof a); //undefined
console.log(typeof true); // boolean
console.log(typeof NaN); // number
console.log(typeof !NaN); //boolean
console.log(typeof {name:"益达",age: "23"}); // object
console.log(typeof ["益达","23"]); // object
console.log(typeof null); // object

你看你看,function还是function但是到了数组那儿,就是object了。

这就引出了这篇的blog

如何检测数组

大部分的浏览器都能通过ECMAScript5当中的isArray函数来检测,这个是一个很好用的内置函数。

1
2
var arr = ['hello','张益达'];
isArray(arr);//true

好的,本blog完结。。。。

=,=怎么可能这么随便,虽然nice的高逼格的客户群是不用不支持ECMAScript5的浏览器(IE8及之前)

但是。。抱着学术的态度,还是要研究研究如果我们自己实现一个isArray换句话说就是在IE8的这种浏览器下,怎么去判断数组;

废话不多说,直接给出方法表:

通过对象自身的constructor属性的判断

1
2
var arr = ["益达","nicefe"];
console.log(arr.constructor === Array); // true

通过向上检测构造属性来判断是否为Array

通过instanceof操作符判断

1
2
var arr = ["益达","nicefe"];
console.log(arr instanceof Array); // true

如果arr是一个Array对象的实例,那么就可以理解它是一个数组。

对象原生的toString方法的检测

1
2
3
4
5
isArray = function(obj) {
return Object.prototype.toString.call(obj) == "[object Array]";
}
var arr = ["益达","nicefe"];
console.log(isArray(arr)); // true

这种是通过判断你要判断的对象是否有toString()方法来判断是否为数组。但是这个方法,额,如果我一不小心给某个对象加上了toString()方法的话,那么这个函数也同样会认为它是数组了。。。。

这三种方法都是有效的;

最后大漠老师总结了一个合成的方法,在不知道浏览器情况的情况下先通过判断isArray()方法是否有效,无效的情况下再通过判断toString是否为它的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var isArray = (function () {
if (Array.isArray) {
return Array.isArray;
}
var objectToStringFn = Object.prototype.toString,
arrayToStringResult = objectToStringFn.call([]);

return function (subject) {
return objectToStringFn.call(subject) === arrayToStringResult;
};
}());

var arr = [];
isArray(arr); // true

over….


留言: